IMPLEMENTATION MODULE Tad_ReporteMateria;

FROM Storage  IMPORT ALLOCATE, DEALLOCATE;
FROM SYSTEM   IMPORT TSIZE;
FROM StrIO    IMPORT WriteString, WriteLn; 
FROM NumberIO IMPORT WriteInt; 
FROM DynamicStrings IMPORT String, Slice, CopyOut, Index, InitString, ConCat;
FROM StringConvert IMPORT StringToInteger, IntegerToString;

TYPE 
	Reporte = POINTER TO P;
	P = RECORD
		codigoMateria:INTEGER;
		cupo : INTEGER;
		solicitado : INTEGER;
	END;


PROCEDURE Reporte_Crear (codigo: INTEGER; cupo : INTEGER; solicitado:INTEGER) : Reporte;
VAR r : Reporte ;
BEGIN
	NEW(r);

	IF (r = NIL) THEN
		RETURN NIL;
	END;

	r^.codigoMateria := codigo;
	r^.cupo := cupo;
	r^.solicitado := solicitado;

	RETURN r;
END Reporte_Crear;

PROCEDURE Imprimir (e : Reporte) ;
BEGIN
   IF e = NIL THEN
       RETURN;
   END;
   WriteString("(");
   WriteInt(e^.codigoMateria, 2);
   WriteString(", ");
   WriteInt(e^.cupo,0);
   WriteString(", ");
   WriteInt(e^.solicitado,0);
   WriteString(")");
   
END Imprimir;

PROCEDURE GetCodigoMateria (e : Reporte):INTEGER;
BEGIN
	IF e = NIL THEN
       RETURN -1;
   END;
   RETURN e^.codigoMateria;
END GetCodigoMateria;

PROCEDURE GetCupo (e : Reporte):INTEGER;
BEGIN
	IF e = NIL THEN
       RETURN -1;
   END;
   RETURN e^.cupo;
END GetCupo;

PROCEDURE GetSolicitado (e : Reporte):INTEGER;
BEGIN
	IF e = NIL THEN
       RETURN -1;
   END;
   RETURN e^.solicitado;
END GetSolicitado;


PROCEDURE ReporteToString(reporte: Reporte): String;
VAR info : String;
VAR i : INTEGER;
BEGIN
	i := GetSolicitado(reporte) - GetCupo(reporte);
        IF i > 0 THEN
	        info:=IntegerToString(GetCodigoMateria(reporte),1,"",FALSE,10,FALSE);
	        info:=ConCat(info,InitString(" "));
	        info:=ConCat(info,IntegerToString(i,1,"",FALSE,10,FALSE));
        END;
        RETURN info;
END ReporteToString;

END Tad_ReporteMateria.
